package com.bank.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bank.entity.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 客户信息数据访问层接口
 * 继承MyBatis Plus的BaseMapper，提供基础CRUD操作
 * 
 * @author 开发团队
 * @version 1.0.0
 * @since 2025-06-19
 */
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {

    /**
     * 根据客户姓名进行模糊查询
     * 
     * @param customerName 客户姓名（支持模糊查询）
     * @return 客户信息列表
     */
    List<UserInfo> selectByCustomerNameLike(@Param("customerName") String customerName);

    /**
     * 根据联系电话进行模糊查询
     * 
     * @param telephone 联系电话（支持模糊查询）
     * @return 客户信息列表
     */
    List<UserInfo> selectByTelephoneLike(@Param("telephone") String telephone);

    /**
     * 根据身份证号进行精确查询
     * 
     * @param pid 身份证号
     * @return 客户信息
     */
    UserInfo selectByPid(@Param("pid") String pid);

    /**
     * 根据创建时间范围查询客户信息
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 客户信息列表
     */
    List<UserInfo> selectByCreateTimeRange(@Param("startTime") LocalDateTime startTime, 
                                          @Param("endTime") LocalDateTime endTime);

    /**
     * 分页查询客户信息（支持多条件组合查询）
     * 
     * @param page 分页参数
     * @param customerName 客户姓名（可选，支持模糊查询）
     * @param pid 身份证号（可选，精确查询）
     * @param telephone 联系电话（可选，模糊查询）
     * @param startTime 创建开始时间（可选）
     * @param endTime 创建结束时间（可选）
     * @return 分页结果
     */
    IPage<UserInfo> selectPageWithConditions(Page<UserInfo> page,
                                            @Param("customerName") String customerName,
                                            @Param("pid") String pid,
                                            @Param("telephone") String telephone,
                                            @Param("startTime") LocalDateTime startTime,
                                            @Param("endTime") LocalDateTime endTime);

    /**
     * 检查身份证号是否已存在（用于新增时验证）
     * 
     * @param pid 身份证号
     * @param excludeCustomerId 排除的客户ID（用于修改时验证）
     * @return 存在的记录数
     */
    int countByPid(@Param("pid") String pid, @Param("excludeCustomerId") Integer excludeCustomerId);

    /**
     * 检查联系电话是否已存在（用于新增时验证）
     * 
     * @param telephone 联系电话
     * @param excludeCustomerId 排除的客户ID（用于修改时验证）
     * @return 存在的记录数
     */
    int countByTelephone(@Param("telephone") String telephone, @Param("excludeCustomerId") Integer excludeCustomerId);

    /**
     * 获取客户统计信息
     * 
     * @return 客户总数
     */
    int selectTotalCount();

    /**
     * 根据客户ID查询是否有关联的银行卡
     * 
     * @param customerId 客户ID
     * @return 关联银行卡数量
     */
    int countCardsByCustomerId(@Param("customerId") Integer customerId);

    /**
     * 批量删除客户信息（软删除）
     * 
     * @param customerIds 客户ID列表
     * @return 影响行数
     */
    int batchDeleteByIds(@Param("customerIds") List<Integer> customerIds);
}
